package com.framework.base.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.orm.ibatis.SqlMapClientCallback;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.framework.base.constant.WebConstants;
import com.framework.base.exception.GeneralException;
import com.framework.base.struts.BaseVo;
import com.framework.base.util.LoggerUtil;
import com.ibatis.sqlmap.client.SqlMapExecutor;

/**
 * @author byt
 * @version 1.0
 */
public class BaseDao extends SqlMapClientDaoSupport {
	private String nameSpace; //配置文件的命名空间 命名空间默认为表名
	
	/**
	 * 取得日志对象
	 * 
	 * @return 返回日志对象
	 */
	public Logger getLogger() {
		Logger logger = Logger.getLogger(getClass()); // 作为日志的公用对象		return logger;
	}

	/**
	 * 用于查询分页列表
	 * @param pagination 当前页面VO
	 * @return ArrayList里装的是查询到的所有VO
	 * @throws GeneralException
	 */
	public List<?> toList(String statementID,
			Object object) throws Exception {
		List<?> list = null;
		try {
			list = getSqlMapClientTemplate().queryForList(this.getNameSpace()+statementID,object);
		} catch (Exception ex) {
			LoggerUtil.logError(ex, getLogger(), "列表查询出错");
			throw ex;
		}
		return list;
	}


	/**
	 * 用于处理数据添加业务
	 * 
	 * @param vo
	 * @throws GeneralException
	 */
	public void doInsert(String statementID, Object obj) throws Exception {
		try {
			getSqlMapClientTemplate().insert(this.getNameSpace()+statementID, obj);
		} catch (Exception ex) {
			LoggerUtil.logError(ex, getLogger(), "数据插入出错");
			throw ex;
		}
	}

	/**
	 * 用于处理数据删除业务,同时对多数据进行批量处理 以避免造成多次交互
	 * @param statementID
	 * @param vo
	 * @throws java.lang.Exception
	 */
	public int doDelete(String statementID, String[] pks) throws Exception {
		List<DataOpVo> dataOpVoList=new ArrayList<DataOpVo>();
		try {
			for (String pk : pks) {
				DataOpVo dataOpVo=new DataOpVo();
				dataOpVo.setStatementId(this.getNameSpace()+statementID);
				dataOpVo.setParamObj(pk);
				dataOpVo.setDataOpType(WebConstants.DATAOP_DELETE);
				dataOpVoList.add(dataOpVo);
			}
			doBatchDataOp(dataOpVoList);
		} catch (Exception ex) {
			LoggerUtil.logError(ex, getLogger(), "删除数据出错");
			throw ex;
		}
		return dataOpVoList.size();
	}


	/**
	 * 处理修改数据的业务
	 * 
	 * @param statementID
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public int doUpdate(String statementID, Object obj) throws Exception {
		int count = 0;
		try {
			count = getSqlMapClientTemplate().update(this.getNameSpace()+statementID,obj);
			count++;
		} catch (Exception ex) {
			LoggerUtil.logError(ex, getLogger(), "修改数据出错");
			throw ex;
		}
		return count;
	}

	/**
	 * 用于查询需要显示的数据
	 * 
	 * @param statementID
	 * @param object
	 * @return
	 * @throws Exception
	 */
	public Object getById(String statementID, Object object) throws Exception {
		Object viewObject = null;
		try {
			viewObject = getSqlMapClientTemplate().queryForObject(this.getNameSpace()+statementID,
					object);
		} catch (Exception ex) {
			LoggerUtil.logError(ex, getLogger(), "查看数据查询出错");
			throw ex;
		}
		return viewObject;
	}

	/**
	 * 用于查询出符合条件的记录数
	 * 
	 * @param statementID
	 * @param obj
	 * @return
	 */
	public int getTotalPageCount(String statementID, Object obj) {
		Object object = null;
		try {
			object = getSqlMapClientTemplate().queryForObject(this.getNameSpace()+statementID,obj);
		} catch (Exception ex) {
			LoggerUtil.logError(ex, getLogger(), "查询总记录数出错");
			ex.printStackTrace();
		}
		if (object == null) // 容错性处理
			return 0;
		return ((Integer) object).intValue();
	}
	

	/**
	 * 用于查询指定条件的列表数据
	 * @param statementID
	 * @param object
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<BaseVo> queryForList(String statementID, Object object) {
		List<BaseVo> resultList=this.getSqlMapClientTemplate().queryForList(this.getNameSpace()+statementID, object);
		if(resultList==null){
			resultList=new ArrayList<BaseVo>();
		}
		return resultList;
	}

	/**
	 * 用于对数据进行批量处理
	 * @param 批量处理的信息集合
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void doBatchDataOp(final List<DataOpVo> dataOpVoList)  { 
		this.getSqlMapClientTemplate().execute(new SqlMapClientCallback() { 
		            public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException { 
		            	int num=0;
		                for (int i = 0; i < dataOpVoList.size(); i++) {
		                	DataOpVo dataOpVo=dataOpVoList.get(i);
		                	getLogger().info("批量执行sql:"+dataOpVo.getParamObj().toString());
		                	if(num==0){
		                		executor.startBatch(); 
		                	}
		                	if(WebConstants.DATAOP_INSERT.equals(dataOpVo.getDataOpType())){
		                		executor.insert(dataOpVo.getStatementId(),dataOpVo.getParamObj());
		                	}
		                	if(WebConstants.DATAOP_UPDATE.equals(dataOpVo.getDataOpType())){
		                		executor.update(dataOpVo.getStatementId(),dataOpVo.getParamObj());
		                	}
		                	if(WebConstants.DATAOP_DELETE.equals(dataOpVo.getDataOpType())){
		                		executor.delete(dataOpVo.getStatementId(), dataOpVo.getParamObj());
		                	}
		                	num++;
		                	if(num==200||num==dataOpVoList.size()){
		                		 executor.executeBatch(); 
		                		 num=0;
		                	}
						}
		                return null; 
		            } 
		        }); 
		}


	public String getNameSpace() {
		return nameSpace+".";
	}

	public void setNameSpace(String nameSpace) {
		this.nameSpace = nameSpace;
	}

}
